package com.dc.designPattern._11_proxy.impl._3_cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Description: 代理模式_Cglib动态代理_创建代理类
 * @author: gdc
 * @date: 2021/4/17
 * @version 1.0
 */
public class ProxyFactory implements MethodInterceptor {

    /**
     * 维护一个目标对象
     */
    private Object target;

    /**
     * 构造器，传入一个被代理的对象
     * @param target            目标对象
     */
    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 返回一个代理对象:  是 target 对象的代理对象
     * @return                  代理对象
     */
    public Object getProxyInstatce(){
        // step 1 创建一个工具类
        Enhancer enhancer = new Enhancer();

        // step 2 创建一个父类
        enhancer.setSuperclass(target.getClass());

        // step 3 设置回调函数
        enhancer.setCallback(this);

        // step 4 创建子类对象，即代理对象
        return enhancer.create();
    }

    /**
     * intercept 方法，会调用目标对象的方法
     * @param obj
     * @param method
     * @param args
     * @param proxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Cglib 代理模式开始了。。。。。");

        Object returnVal = method.invoke(target, args);

        System.out.println("Cglib 代理模式结束了。。。。。");

        return returnVal;
    }
}
